/**
 * @brief MCU DAC 驱动
 * @author 张勇 41204@qq.com
 * @date 2022-04
 */
 
#pragma once

#include "stm32f4xx_ll_dac.h"
#include "mcu.h"

/**
 * @brief MCU DAC 输出引脚 <=> GPIO 引脚对应关系
 * @note ADC12_IN4 = DAC_OUT1 复用了 PA4
 * @note ADC12_IN5 = DAC_OUT2 复用了 PA5
 */

// DAC 控制器数据结构
typedef struct _mcu_dac {
    DAC_TypeDef *dac;
    uint32_t chmask_init;   // 通道初始化状态掩码，对应位为 1 表示已经初始化
} mcu_dac_t;


#ifdef __cplusplus
extern "C" {
#endif


/// @brief 初始化 DAC 通道
/// @param chmask 通道掩码。每一位表示一个通道，掩码为 1 的通道初始化
std_err_t mcu_dac_init(mcu_dac_t *dev, uint32_t chmask);

/// @brief 命名的DAC控制器定义(名字, DAC设备号, 要使用的DAC通道掩码)
/// @note 示例: DAC_DEFINE(FAN_DAC, DAC1, 0x03)
#define DAC_DEFINE(NAME, DACx, CHMASK) \
    static mcu_dac_t _##NAME = {.dac = DACx, .chmask_init = 0}; \
    mcu_dac_t *NAME = &_##NAME; \
    std_err_t NAME##_Init() { return mcu_dac_init(NAME, CHMASK); } \
    std_err_t NAME##_Write(uint32_t chmask, int32_t val) { return mcu_dac_write(NAME, chmask, val); } \
    std_err_t NAME##_Start(uint32_t chmask) { return mcu_dac_start(NAME, chmask); } \
    std_err_t NAME##_Stop(uint32_t chmask) { return mcu_dac_stop(NAME, chmask); }
    
	
#ifdef __cplusplus
}
#endif
